#pragma once

#include <iostream>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include <string>

// DFA状态类
class DFAState {
public:
    std::string name;
    bool isFinal;
    bool need_retract;
    std::string type;

    DFAState(std::string name_, bool isFinal_ = false, bool need_retract_ = false, std::string type_ = "") : name(name_), isFinal(isFinal_), need_retract(need_retract_), type(type_) {}
};

struct PairHash {
    template <typename T1, typename T2>
    size_t operator()(const std::pair<T1, T2>& p) const {
        auto hash1 = std::hash<T1>{}(p.first);
        auto hash2 = std::hash<T2>{}(p.second);
        return hash1 ^ (hash2 << 1);
    }
};

// 为pair<DFAState*, char>定义相等比较
struct PairEqual {
    template <typename T1, typename T2>
    bool operator()(const std::pair<T1, T2>& lhs, const std::pair<T1, T2>& rhs) const {
        return lhs.first == rhs.first && lhs.second == rhs.second;
    }
};

// DFA类定义
class DFA {
private:
    std::vector<DFAState> states;                          // 所有状态集合
    std::unordered_set<char> alphabet;                     // 输入字母表
    DFAState* currentState;                           // 当前状态
    DFAState* initialState;                           // 初始状态
    std::unordered_map<std::pair<DFAState*, char>, DFAState*, PairHash, PairEqual> transitionTable; // 转换表
    std::unordered_map<DFAState*, std::pair<std::unordered_set<char>, DFAState*>> non_transitionTable; // 非转换表

public:
    // 构造函数
    DFA() : currentState(nullptr), initialState(nullptr) { states.reserve(100); }

    // 添加状态
    void add_state(const char *name, bool isFinal = false, bool need_retract_ = false, const char *type_ = "");

    // 设置初始状态
    void set_initial(const char *name);

    // 设置最终状态
    void set_final(const char *name);

    // 获取当前状态
    DFAState *get_current() { return currentState; }

    // 添加转换规则
    void add_transition(const char *from, char input, const char *to);

    void add_non_transition(const char *from, char input, const char *to);

    // 状态转换函数
    bool next(char input);

    // 重置到初始状态
    void reset();

    // 打印DFA信息
    void print();
};

// 示例使用
/*int main() {
    // 创建一个DFA来识别以"ab"结尾的字符串
    DFA dfa;
    
    // 添加状态
    dfa.addState("q0");
    dfa.addState("q1");
    dfa.addState("q2", true); // 最终状态
    
    // 设置初始状态
    dfa.setInitialState("q0");
    
    // 添加转换规则
    dfa.addTransition("q0", 'a', "q1");
    dfa.addTransition("q0", 'b', "q0");
    dfa.addTransition("q1", 'a', "q1");
    dfa.addTransition("q1", 'b', "q2");
    dfa.addTransition("q2", 'a', "q1");
    dfa.addTransition("q2", 'b', "q0");
    
    // 打印DFA信息
    dfa.printDFA();
    
    return 0;
}*/